package com.sojson.util.zookeeper;

import java.util.List;
import java.util.concurrent.CountDownLatch;

import org.apache.zookeeper.data.Stat;

/**
 * Zookeeper工具类接口
 * 
 * @author liu
 * @date 2020-11-15
 */
public interface ZookeeperUtilInterface {

    /**
     * 给Zookeeper添加帐号密码
     * 
     * @return
     * @throws Exception
     */
    ZookeeperUtilInterface addAcl();

    /**
     * 给Zookeeper添加帐号密码
     * 
     * @param auth 帐号:密码
     * @return
     * @throws Exception
     */
    ZookeeperUtilInterface addAcl(String auth);

    /**
     * 给Zookeeper添加帐号密码
     * 
     * @param auth 帐号:密码
     * @return
     * @throws Exception
     */
    ZookeeperUtilInterface addAcl(byte[] auth);

    /**
     * 给Zookeeper添加帐号密码
     * 
     * @param username 帐号
     * @param password 密码
     * @return
     * @throws Exception
     */
    ZookeeperUtilInterface addAcl(String username, String password);

    /**
     * 同步创建一个持久节点,ACL为 world:anyone:cdrwa 等同于如下命令: 
     * create path data world:anyone:cdrwa
     * 
     * @param path 节点
     * @return
     * @throws Exception
     */
    String create(String path) throws Exception;

    /**
     * 同步创建一个持久节点,ACL为 world:anyone:cdrwa 等同于如下命令: 
     * create path data world:anyone:cdrwa
     * 
     * @param path 节点
     * @param data 内容
     * @return
     * @throws Exception
     */
    String create(String path, String data) throws Exception;

    /**
     * 同步创建一个持久节点,ACL为 world:anyone:cdrwa 等同于如下命令: 
     * create path data world:anyone:cdrwa
     * 
     * @param path 节点
     * @param data 内容
     * @return
     * @throws Exception
     */
    String createByte(String path, byte[] data) throws Exception;

    /**
     * 同步创建一个持久顺序节点,ACL为 world:anyone:cdrwa 等同于如下命令: 
     * create path data world:anyone:cdrwa
     * 
     * @param path 节点
     * @return
     * @throws Exception
     */
    String createSort(String path) throws Exception;

    /**
     * 同步创建一个持久顺序节点,ACL为 world:anyone:cdrwa 等同于如下命令: 
     * create path data world:anyone:cdrwa
     * 
     * @param path 节点
     * @param data 内容
     * @return
     * @throws Exception
     */
    String createSort(String path, String data) throws Exception;

    /**
     * 同步创建一个持久顺序节点,ACL为 world:anyone:cdrwa 等同于如下命令: 
     * create path data world:anyone:cdrwa
     * 
     * @param path 节点
     * @param data 内容
     * @return
     * @throws Exception
     */
    String createSortByte(String path, byte[] data) throws Exception;

    /**
     * 同步创建一个有效时间的持久顺序节点
     * 
     * @param path      节点
     * @param timeOut   超时时间(单位: 毫秒)
     * @return
     * @throws Exception
     */
    String createSort(String path, long timeOut) throws Exception;

    /**
     * 同步创建一个有效时间的持久顺序节点,同时设置节点信息
     * 
     * @param path      节点
     * @param stat      节点信息
     * @param timeOut   超时时间(单位: 毫秒)
     * @return
     * @throws Exception
     */
    String createSort(String path, Stat stat, long timeOut) throws Exception;

    /**
     * 同步创建一个有效时间的持久顺序节点
     * 
     * @param path      节点
     * @param data   内容
     * @param timeOut   超时时间(单位: 毫秒)
     * @return
     * @throws Exception
     */
    String createSort(String path, String data, long timeOut) throws Exception;

    /**
     * 同步创建一个有效时间的持久顺序节点
     * 
     * @param path      节点
     * @param data   内容
     * @param timeOut   超时时间(单位: 毫秒)
     * @return
     * @throws Exception
     */
    String createSortByte(String path, byte[] data, long timeOut) throws Exception;

    /**
     * 同步创建一个有效时间的持久顺序节点,同时注册监听
     * 
     * @param path      节点
     * @param data   内容
     * @param stat      节点信息
     * @param timeOut   超时时间(单位: 毫秒)
     * @return
     * @throws Exception
     */
    String createSort(String path, String data, Stat stat, long timeOut) throws Exception;

    /**
     * 同步创建一个有效时间的持久顺序节点,同时注册监听
     * 
     * @param path      节点
     * @param data   内容
     * @param stat      节点信息
     * @param timeOut   超时时间(单位: 毫秒)
     * @return
     * @throws Exception
     */
    String createSortByte(String path, byte[] data, Stat stat, long timeOut) throws Exception;

    /**
     * 同步创建一个临时节点,ACL为 world:anyone:cdrwa 等同于如下命令: 
     * create path data world:anyone:cdrwa
     * 
     * @param path 节点
     * @return
     * @throws Exception
     */
    String createTemporary(String path) throws Exception;

    /**
     * 同步创建一个临时节点,ACL为 world:anyone:cdrwa 等同于如下命令: 
     * create path data world:anyone:cdrwa
     * 
     * @param path 节点
     * @param data 内容
     * @return
     * @throws Exception
     */
    String createTemporary(String path, String data) throws Exception;

    /**
     * 同步创建一个临时节点,ACL为 world:anyone:cdrwa 等同于如下命令: 
     * create path data world:anyone:cdrwa
     * 
     * @param path 节点
     * @param data 内容
     * @return
     * @throws Exception
     */
    String createTemporaryByte(String path, byte[] data) throws Exception;

    /**
     * 同步创建一个临时顺序节点,ACL为 world:anyone:cdrwa 等同于如下命令: 
     * create path data world:anyone:cdrwa
     * 
     * @param path 节点
     * @return
     * @throws Exception
     */
    String createTemporarySort(String path) throws Exception;

    /**
     * 同步创建一个临时顺序节点,ACL为 world:anyone:cdrwa 等同于如下命令: 
     * create path data world:anyone:cdrwa
     * 
     * @param path 节点
     * @param data 内容
     * @return
     * @throws Exception
     */
    String createTemporarySort(String path, String data) throws Exception;

    /**
     * 同步创建一个临时顺序节点,ACL为 world:anyone:cdrwa 等同于如下命令: 
     * create path data world:anyone:cdrwa
     * 
     * @param path 节点
     * @param data 内容
     * @return
     * @throws Exception
     */
    String createTemporarySortByte(String path, byte[] data) throws Exception;

    /**
     * 删除节点
     * 
     * @param path 节点
     * @throws Exception 
     */
    void delete(String path) throws Exception;

    /**
     * 修改节点内容
     * 
     * @param path 节点
     * @param data 内容
     * @throws Exception 
     */
    void setData(String path, byte[] data) throws Exception;

    /**
     * 修改节点内容
     * 
     * @param path 节点
     * @param data 内容
     * @throws Exception 
     */
    void setData(String path, String data) throws Exception;

    /**
     * 获取节点内容(不注册监听)
     * 
     * @param path 节点
     * @param stat 通过exists查出来的对象
     * @return
     * @throws Exception
     */
    byte[] getData(String path, Stat stat) throws Exception;

    /**
     * 获取节点内容(同时注册监听)
     * 
     * @param path 节点
     * @param stat 通过exists查出来的对象
     * @return
     * @throws Exception
     */
    byte[] getDataTrue(String path, Stat stat) throws Exception;

    /**
     * 获取节点内容(同时注册监听)
     * 
     * @param path 节点
     * @param watcher 监视器
     * @param stat 通过exists查出来的对象
     * @return
     * @throws Exception
     */
    byte[] getData(String path, CustomWatcher watcher, Stat stat) throws Exception;

    /**
     * 获取指定节点的所有子节点(不注册监听)
     * 
     * @param path 节点
     * @return
     * @throws Exception
     */
    List<String> getChildren(String path) throws Exception;

    /**
     * 获取指定节点的所有子节点(同时注册监听)
     * 
     * @param path 节点
     * @return
     * @throws Exception
     */
    List<String> getChildrenTrue(String path) throws Exception;

    /**
     * 获取指定节点的所有子节点(同时注册监听)
     * 
     * @param path 节点
     * @param watcher 
     * @return
     * @throws Exception
     */
    List<String> getChildren(String path, CustomWatcher watcher) throws Exception;

    /**
     * 判断节点是否存在(不注册监听)
     * 
     * @param path 节点
     * @return
     * @throws Exception
     */
    Stat exists(String path) throws Exception;

    /**
     * 判断节点是否存在(同时注册监听)
     * 
     * @param path 节点
     * @return
     * @throws Exception
     */
    Stat existsTrue(String path) throws Exception;

    /**
     * 判断节点是否存在(同时注册监听)
     * 
     * @param path 节点
     * @param watcher 
     * @return
     * @throws Exception
     */
    Stat exists(String path, CustomWatcher watcher) throws Exception;

    /**
     * 打开连接
     * 
     * @return 
     */
    ZookeeperUtilInterface open();

    /**
     * 获取ZooKeeper
     * 
     * @return 
     */
    ZookeeperUtilInterface getInstances();

    /**
     * 获取ZooKeeper
     * 
     * @param url 连接地址
     * @return 
     */
    ZookeeperUtilInterface getInstances(String url);

    /**
     * 获取ZooKeeper
     * 
     * @param watcher 监视器
     * @param countDownLatch 因为连接需要时间,所以需要在连接的时候暂停线程,连接成功后会有个回调方法,在回调方法中让计数减一后变成0恢复线程
     * @return 
     */
    ZookeeperUtilInterface getInstances(CustomWatcher watcher, CountDownLatch countDownLatch);

    /**
     * 获取ZooKeeper
     * 
     * @param url 连接地址
     * @param watcher 监视器
     * @param countDownLatch 因为连接需要时间,所以需要在连接的时候暂停线程,连接成功后会有个回调方法,在回调方法中让计数减一后变成0恢复线程
     * @return
     */
    ZookeeperUtilInterface getInstances(String url, CustomWatcher watcher, CountDownLatch countDownLatch);

    /**
     * 关闭连接
     * 
     * @return 
     * @throws Exception 
     */
    void close() throws Exception;

}